package com.cirkana.serial;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.util.ArrayList;
import java.util.Date;

import com.cirkana.DateUtil;

public class SerializablePassDataTestImpl extends SerializablePassData {

	private Boolean booleanAttribute;
	private Boolean[] booleanArrayAttribute;
	private Date dateAttribute;
	private Date[] dateArrayAttribute;
	private Double doubleAttribute;
	private Double[] doubleArrayAttribute;
	private Float floatAttribute;
	private Float[] floatArrayAttribute;
	private Integer integerAttribute;
	private Integer[] integerArrayAttribute;
	private String stringAttribute;
	private String[] stringArrayAttribute;
	private SerializablePassDataTestImpl serializableAttribute;
	private ArrayList<SerializablePassDataTestImpl> serializableListAttribute;

	public Boolean getBooleanAttribute() {
		return booleanAttribute;
	}

	public void setBooleanAttribute(Boolean booleanAttribute) {
		this.booleanAttribute = booleanAttribute;
	}

	public Boolean[] getBooleanArrayAttribute() {
		return booleanArrayAttribute;
	}

	public void setBooleanArrayAttribute(Boolean[] booleanArrayAttribute) {
		this.booleanArrayAttribute = booleanArrayAttribute;
	}

	public Date getDateAttribute() {
		return dateAttribute;
	}

	public void setDateAttribute(Date dateAttribute) {
		this.dateAttribute = dateAttribute;
	}

	public Date[] getDateArrayAttribute() {
		return dateArrayAttribute;
	}

	public void setDateArrayAttribute(Date[] dateArrayAttribute) {
		this.dateArrayAttribute = dateArrayAttribute;
	}

	public Double getDoubleAttribute() {
		return doubleAttribute;
	}

	public void setDoubleAttribute(Double doubleAttribute) {
		this.doubleAttribute = doubleAttribute;
	}

	public Double[] getDoubleArrayAttribute() {
		return doubleArrayAttribute;
	}

	public void setDoubleArrayAttribute(Double[] doubleArrayAttribute) {
		this.doubleArrayAttribute = doubleArrayAttribute;
	}

	public Float getFloatAttribute() {
		return floatAttribute;
	}

	public void setFloatAttribute(Float floatAttribute) {
		this.floatAttribute = floatAttribute;
	}

	public Float[] getFloatArrayAttribute() {
		return floatArrayAttribute;
	}

	public void setFloatArrayAttribute(Float[] floatArrayAttribute) {
		this.floatArrayAttribute = floatArrayAttribute;
	}

	public Integer getIntegerAttribute() {
		return integerAttribute;
	}

	public void setIntegerAttribute(Integer integerAttribute) {
		this.integerAttribute = integerAttribute;
	}

	public Integer[] getIntegerArrayAttribute() {
		return integerArrayAttribute;
	}

	public void setIntegerArrayAttribute(Integer[] integerArrayAttribute) {
		this.integerArrayAttribute = integerArrayAttribute;
	}

	public String getStringAttribute() {
		return stringAttribute;
	}

	public void setStringAttribute(String stringAttribute) {
		this.stringAttribute = stringAttribute;
	}

	public String[] getStringArrayAttribute() {
		return stringArrayAttribute;
	}

	public void setStringArrayAttribute(String[] stringArrayAttribute) {
		this.stringArrayAttribute = stringArrayAttribute;
	}

	public SerializablePassDataTestImpl getSerializableAttribute() {
		return serializableAttribute;
	}

	public void setSerializableAttribute(
			SerializablePassDataTestImpl serializableAttribute) {
		this.serializableAttribute = serializableAttribute;
	}

	public ArrayList<SerializablePassDataTestImpl> getSerializableListAttribute() {
		return serializableListAttribute;
	}

	public void setSerializableListAttribute(
			ArrayList<SerializablePassDataTestImpl> serializableListAttribute) {
		this.serializableListAttribute = serializableListAttribute;
	}

	@Override
	public void serialize(DataOutputStream out) throws SerializationException {
		serializeDate(dateAttribute, out);
		serializeFloatArray(floatArrayAttribute, out);
		serializeBoolean(booleanAttribute, out);
		serializeSerializable(serializableAttribute, out);
		serializeStringArray(stringArrayAttribute, out);
		serializeBooleanArray(booleanArrayAttribute, out);
		serializeString(stringAttribute, out);
		serializeDateArray(dateArrayAttribute, out);
		serializeDouble(doubleAttribute, out);
		serializeInteger(integerAttribute, out);
		serializeDoubleArray(doubleArrayAttribute, out);
		serializeIntegerArray(integerArrayAttribute, out);
		serializeSerializableList(serializableListAttribute, this.getClass(), out);
		serializeFloat(floatAttribute, out);
	}

	@SuppressWarnings("unchecked")
	@Override
	public void deserialize(DataInputStream in) throws SerializationException {
		dateAttribute = deserializeDate(in);
		floatArrayAttribute = deserializeFloatArray(in);
		booleanAttribute = deserializeBoolean(in);
		serializableAttribute = (SerializablePassDataTestImpl) deserializeSerializable(
				SerializablePassDataTestImpl.class, in);
		stringArrayAttribute = deserializeStringArray(in);
		booleanArrayAttribute = deserializeBooleanArray(in);
		stringAttribute = deserializeString(in);
		dateArrayAttribute = deserializeDateArray(in);
		doubleAttribute = deserializeDouble(in);
		integerAttribute = deserializeInteger(in);
		doubleArrayAttribute = deserializeDoubleArray(in);
		integerArrayAttribute = deserializeIntegerArray(in);
		serializableListAttribute = deserializeSerializableList(this.getClass(), in);
		floatAttribute = deserializeFloat(in);
	}

	@Override
	public String toString() {
		StringBuilder s = new StringBuilder("{");

		s.append("booleanAttribute=");
		if (booleanAttribute == null)
			s.append("(null)");
		else
			s.append(booleanAttribute.toString());
		s.append(",");

		s.append("booleanArrayAttribute=");
		if (booleanArrayAttribute == null)
			s.append("(null)");
		else {
			s.append("{");
			for (Boolean bool : booleanArrayAttribute) {
				if (bool == null)
					s.append("(null)");
				else
					s.append(bool.toString());
				s.append(",");
			}
			s.delete(s.length(), s.length());
			s.append("}");
		}
		s.append(",");

		s.append("dateAttribute=");
		if (dateAttribute == null)
			s.append("(null)");
		else
			s.append(DateUtil.getPresentationDate(dateAttribute));
		s.append(",");

		s.append("dateArrayAttribute=");
		if (dateArrayAttribute == null)
			s.append("(null)");
		else {
			s.append("{");
			for (Date date : dateArrayAttribute) {
				if (date == null)
					s.append("(null)");
				else
					s.append(DateUtil.getPresentationDate(date));
				s.append(",");
			}
			s.delete(s.length(), s.length());
			s.append("}");
		}
		s.append(",");

		s.append("doubleAttribute=");
		if (doubleAttribute == null)
			s.append("(null)");
		else
			s.append(doubleAttribute.toString());
		s.append(",");

		s.append("doubleArrayAttribute=");
		if (doubleArrayAttribute == null)
			s.append("(null)");
		else {
			s.append("{");
			for (Double doubl : doubleArrayAttribute) {
				if (doubl == null)
					s.append("(null)");
				else
					s.append(doubl.toString());
				s.append(",");
			}
			s.delete(s.length(), s.length());
			s.append("}");
		}
		s.append(",");

		s.append("floatAttribute=");
		if (floatAttribute == null)
			s.append("(null)");
		else
			s.append(floatAttribute.toString());
		s.append(",");

		s.append("floatArrayAttribute=");
		if (floatArrayAttribute == null)
			s.append("(null)");
		else {
			s.append("{");
			for (Float floa : floatArrayAttribute) {
				if (floa == null)
					s.append("(null)");
				else
					s.append(floa.toString());
				s.append(",");
			}
			s.delete(s.length(), s.length());
			s.append("}");
		}
		s.append(",");

		s.append("integerAttribute=");
		if (integerAttribute == null)
			s.append("(null)");
		else
			s.append(integerAttribute.toString());
		s.append(",");

		s.append("integerArrayAttribute=");
		if (integerArrayAttribute == null)
			s.append("(null)");
		else {
			s.append("{");
			for (Integer integer : integerArrayAttribute) {
				if (integer == null)
					s.append("(null)");
				else
					s.append(integer.toString());
				s.append(",");
			}
			s.delete(s.length(), s.length());
			s.append("}");
		}
		s.append(",");

		s.append("stringAttribute=");
		if (stringAttribute == null)
			s.append("(null)");
		else
			s.append(stringAttribute);
		s.append(",");

		s.append("stringArrayAttribute=");
		if (stringArrayAttribute == null)
			s.append("(null)");
		else {
			s.append("{");
			for (String string : stringArrayAttribute) {
				if (string == null)
					s.append("(null)");
				else
					s.append(string);
				s.append(",");
			}
			s.delete(s.length(), s.length());
			s.append("}");
		}
		s.append(",");

		s.append("serializableAttribute=");
		if (serializableAttribute == null)
			s.append("(null)");
		else
			s.append(serializableAttribute.toString());
		s.append(",");

		s.append("serializableListAttribute=");
		if (serializableListAttribute == null)
			s.append("(null)");
		else {
			s.append("{");
			for (SerializablePassDataTestImpl serializable : serializableListAttribute) {
				if (serializable == null)
					s.append("(null)");
				else
					s.append(serializable.toString());
				s.append(",");
			}
			s.delete(s.length(), s.length());
			s.append("}");
		}

		s.append("}");
		return s.toString();
	}

}
